﻿using System;
using System.Collections.Generic;
using System.Linq;
using Entidades;

namespace AccesoADatos
{
	public class AuxiliarPregunta
	{
		#region Constructor

		EvaluacionEntities _context;

		public AuxiliarPregunta()
		{
			_context = new EvaluacionEntities();
			_context.ContextOptions.ProxyCreationEnabled = false;
		} 

		#endregion

		#region Métodos

		#region Agregar

		public Pregunta Agregar(Pregunta pregunta)
		{
			try
			{
				_context.Preguntas.AddObject(pregunta);
				_context.SaveChanges();
			}
			catch (Exception ex)
			{
				throw (ex);
			}
			return pregunta;
		}

		#endregion

		#region Modificar

		public void Modificar(Pregunta pregunta)
		{
			try
			{
				_context.Preguntas.Attach(pregunta);
				_context.ObjectStateManager.ChangeObjectState(pregunta, System.Data.EntityState.Modified);
				_context.SaveChanges();
			}
			catch (Exception ex)
			{
				throw (ex);
			}
		}

		#endregion

		#region Eliminar

		public void Eliminar(Pregunta pregunta)
		{
			try
			{
				_context.Preguntas.Attach(pregunta);
				_context.Preguntas.DeleteObject(pregunta);
				_context.SaveChanges();
			}
			catch (Exception ex)
			{
				throw (ex);
			}
		}

		#endregion

		#region Listar

		public List<Pregunta> Listar(string examenClave = "", short habilidadId = 0, short id = 0)
		{
			List<Pregunta> resultado = new List<Pregunta>();
			try
			{
				var q = from c in _context.Preguntas
								where
									(examenClave == "" || c.ExamenesClave == examenClave) &&
									(habilidadId == 0 || c.HabilidadesId == habilidadId) &&
									(id == 0 || c.Id == id)
								select c;

				resultado = q.ToList();
			}
			catch (Exception ex)
			{
				throw (ex);
			}
			return resultado;
		}

		#endregion

		#region Obtener

		public PreguntaAleatoria Obtener(string examenClave, short habilidadId)
		{
			PreguntaAleatoria resultado = new PreguntaAleatoria();
			try
			{
				var ids = 
					_context.Preguntas
						.Where(p =>
							p.ExamenesClave == examenClave &&
							p.HabilidadesId == habilidadId)
						.Select(p => p.Id)
					.Except(
					_context.ExamenPreguntas
						.Where(ep =>
							ep.PreguntasExamenesClave == examenClave &&
							ep.PreguntasHabilidadesId == habilidadId)
						.Select(ep => ep.PreguntasId)
						);

				var q = 
					_context.Preguntas
						.Where(c => ids.Contains(c.Id))
						.AsEnumerable()
						.OrderBy(c => Guid.NewGuid())
						.Select(c => new PreguntaAleatoria()
						{
							Id = c.Id,
							Enunciado = c.Enunciado,
							Comentario = c.Comentario,
							Referencia = c.Referencia,
							TiempoEstimado = c.TiempoEstimado
						});

				resultado = q.FirstOrDefault();
			}
			catch (Exception ex)
			{
				throw (ex);
			}
			return resultado;
		}

		#endregion 

		#endregion
	}
}
